home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 1843 / 1843.xpi / content / firebug / activation.js < prev    next >
Text File  |  2010-01-15  |  10KB  |  309 lines

  1. /* See license.txt for terms of usage */
  2.  
  3. FBL.ns(function() { with (FBL) {
  4.  
  5. // ************************************************************************************************
  6. // Constants
  7.  
  8. const Cc = Components.classes;
  9. const Ci = Components.interfaces;
  10.  
  11. const detachCommand = $("cmd_toggleDetachFirebug");
  12.  
  13. // ************************************************************************************************
  14.  
  15. /**
  16.  * @class Implements Firebug activation logic.
  17.  *
  18.  * 1) Part of the logic is based on annotation service (see components/firebug-annotations.js)
  19.  *    in order to remember whether Firebug is activated for given site or not.
  20.  *    If there is "firebugged.showFirebug" annotation for a given site Firbug is activated.
  21.  *    If there is "firebugged.closed" annotation for a given site Firbug is not activated.
  22.  *
  23.  * 2) Other part is based on extensions.firebug.allPagesActivation option. This option
  24.  *    can be set to the following values:
  25.  *    none: The option isn't used (default value)
  26.  *    on:   Firebug is activated for all URLs.
  27.  *    off:  Firebug is never activated.
  28.  *
  29.  *    This logic has higher priority over the URL annotations.
  30.  *    If "off" options is selected, all existing URL annotations are removed.
  31.  */
  32. Firebug.Activation = extend(Firebug.Module,
  33. {
  34.     dispatchName: "activation",
  35.  
  36.     initializeUI: function()  // called once
  37.     {
  38.         Firebug.Module.initializeUI.apply(this, arguments);
  39.  
  40.         TabWatcher.addListener(this.TabWatcherListener);
  41.  
  42.         // The "off" option is removed so make sure to convert previsous prev value
  43.         // into "none" if necessary.
  44.         if (Firebug.allPagesActivation == "off")
  45.             Firebug.allPagesActivation = "none";
  46.  
  47.         // Update option menu item.
  48.         this.updateAllPagesActivation();
  49.     },
  50.  
  51.     getAnnotationService: function()
  52.     {
  53.         if(!this.annotationSvc)
  54.         {
  55.             // Create annotation service.
  56.             this.annotationSvc = Cc["@joehewitt.com/firebug-annotation-service;1"]
  57.                 .getService(Ci.nsISupports).wrappedJSObject;
  58.         }
  59.         return this.annotationSvc;
  60.     },
  61.  
  62.     shutdown: function()
  63.     {
  64.         Firebug.Module.shutdown.apply(this, arguments);
  65.  
  66.         TabWatcher.removeListener(this.TabWatcherListener);
  67.  
  68.         this.getAnnotationService().flush();
  69.     },
  70.  
  71.     convertToURIKey: function(url, sameOrigin)  // process the URL to canonicalize it. Need not be reversible.
  72.     {
  73.         var uri = makeURI(normalizeURL(url));
  74.  
  75.         if (Firebug.filterSystemURLs && isSystemURL(url))
  76.             return uri;
  77.  
  78.         if (url == "about:blank")  // avoid exceptions.
  79.             return uri;
  80.  
  81.         if (uri && sameOrigin)
  82.         {
  83.             try
  84.             {
  85.                 var prePath = uri.prePath; // returns the string before the path (such as "scheme://user:password@host:port").
  86.                 var shortURI = makeURI(prePath);
  87.                 if (!shortURI)
  88.                     return uri;
  89.  
  90.                 var host = shortURI.host;
  91.                 if (host)
  92.                 {
  93.                     var crossDomain = host.split('.').slice(-2)
  94.                     shortURI.host = crossDomain.join('.');
  95.                     return shortURI
  96.                 }
  97.             }
  98.             catch (exc)
  99.             {
  100.                 return uri;
  101.             }
  102.         }
  103.         return uri;
  104.     },
  105.  
  106.     shouldCreateContext: function(browser, url, userCommands)  // true if the Places annotation the URI "firebugged"
  107.     {
  108.         if (Firebug.allPagesActivation == "on")
  109.             return true;
  110.  
  111.         if (Firebug.filterSystemURLs && isSystemURL(url)) // if about:blank gets thru, 1483 fails
  112.             return false;
  113.  
  114.         if (userCommands)
  115.             return true;
  116.  
  117.         if (browser.showFirebug && url.substr(0, 8) === "wyciwyg:")  // document.open on a firebugged page
  118.             return true;
  119.  
  120.         try
  121.         {
  122.             var uri = this.convertToURIKey(url, Firebug.activateSameOrigin);
  123.             if (!uri)
  124.                 return false;
  125.  
  126.             var hasAnnotation = this.getAnnotationService().pageHasAnnotation(uri);
  127.  
  128.             if (hasAnnotation)
  129.                 return this.checkAnnotation(browser, uri);
  130.  
  131.             if (browser.FirebugLink) // then TabWatcher found a connection
  132.             {
  133.                 var dst = browser.FirebugLink.dst;
  134.                 var dstURI = this.convertToURIKey(dst.spec, Firebug.activateSameOrigin);
  135.                 if (dstURI && dstURI.equals(uri)) // and it matches us now
  136.                 {
  137.                     var srcURI = this.convertToURIKey(browser.FirebugLink.src.spec, Firebug.activateSameOrigin);
  138.                     if (srcURI)
  139.                     {
  140.                         if (srcURI.schemeIs("file") || (dstURI.host == srcURI.host) ) // and it's on the same domain
  141.                         {
  142.                             hasAnnotation = this.getAnnotationService().pageHasAnnotation(srcURI);
  143.                             if (hasAnnotation) // and the source page was annotated.
  144.                             {
  145.                                 var srcShow = this.checkAnnotation(browser, srcURI);
  146.                                 if (srcShow)  // and the source annotation said show it
  147.                                     this.watchBrowser(browser);  // so we show dst as well.
  148.                                 return srcShow;
  149.                             }
  150.                         }
  151.                     }
  152.                 }
  153.                 else
  154.                 {
  155.                 }
  156.             }
  157.             else if (browser.contentWindow.opener)
  158.             {
  159.                 var openerContext = TabWatcher.getContextByWindow(browser.contentWindow.opener);
  160.  
  161.                 if (openerContext)
  162.                     return true;  // popup windows of Firebugged windows are Firebugged
  163.             }
  164.  
  165.             return false;   // don't createContext
  166.         }
  167.         catch (exc)
  168.         {
  169.         }
  170.     },
  171.  
  172.     checkAnnotation: function(browser, uri)
  173.     {
  174.         var annotation = this.getAnnotationService().getPageAnnotation(uri);
  175.  
  176.         if ((Firebug.allPagesActivation != "on") && (annotation.indexOf("closed") > 0))
  177.             return false; // annotated as 'closed', don't create
  178.         else
  179.             return true;    // annotated, createContext
  180.     },
  181.  
  182.     shouldShowContext: function(context)
  183.     {
  184.         return this.shouldCreateContext(context.browser, context.getWindowLocation().toString());
  185.     },
  186.  
  187.     watchBrowser: function(browser)  // Firebug is opened in browser
  188.     {
  189.         var annotation = "firebugged.showFirebug";
  190.         this.setPageAnnotation(browser.currentURI.spec, annotation);
  191.     },
  192.  
  193.     unwatchBrowser: function(browser, userCommands)  // Firebug closes in browser
  194.     {
  195.         var uri = browser.currentURI.spec;
  196.         if (userCommands)  // then mark to not open virally.
  197.             this.setPageAnnotation(uri, "firebugged.closed");
  198.         else
  199.             this.removePageAnnotation(uri); // unmark this URI
  200.     },
  201.  
  202.     clearAnnotations: function()
  203.     {
  204.         this.getAnnotationService().clear();
  205.     },
  206.  
  207.     setPageAnnotation: function(currentURI, annotation)
  208.     {
  209.         var uri = this.convertToURIKey(currentURI, Firebug.activateSameOrigin);
  210.         if (uri)
  211.             this.getAnnotationService().setPageAnnotation(uri, annotation);
  212.  
  213.         if (Firebug.activateSameOrigin)
  214.         {
  215.             uri = this.convertToURIKey(currentURI, false);
  216.             if (uri)
  217.                 this.getAnnotationService().setPageAnnotation(uri, annotation);
  218.         }
  219.     },
  220.  
  221.     removePageAnnotation: function(currentURI)
  222.     {
  223.         var uri = this.convertToURIKey(currentURI, Firebug.activateSameOrigin);
  224.         if (uri)
  225.             this.getAnnotationService().removePageAnnotation(uri);
  226.  
  227.         if (Firebug.activateSameOrigin)
  228.         {
  229.             uri = this.convertToURIKey(currentURI, false);
  230.             if (uri)
  231.                 this.getAnnotationService().removePageAnnotation(uri);
  232.         }
  233.  
  234.     },
  235.  
  236.     iterateAnnotations: function(fn)  // stops at the first fn(uri) that returns a true value
  237.     {
  238.         var annotations = this.getAnnotationService().getAnnotations(this.annotationName);
  239.         for (var uri in annotations)
  240.         {
  241.             var rc = fn(uri, annotations[uri]);
  242.             if (rc)
  243.                 return rc;
  244.         }
  245.     },
  246.  
  247.     toggleAll: function(state)
  248.     {
  249.         if (state == "on")
  250.         {
  251.             if (Firebug.allPagesActivation == state) // then we were armed
  252.                 Firebug.allPagesActivation = "none";
  253.             else
  254.                 this.allOn();
  255.  
  256.             // don't show Off button if we are always on
  257.             Firebug.chrome.disableOff(Firebug.allPagesActivation == "on");
  258.         }
  259.         else
  260.         {
  261.             Firebug.allPagesActivation = "none";
  262.         }
  263.  
  264.         Firebug.setPref(Firebug.prefDomain, "allPagesActivation", Firebug.allPagesActivation);
  265.         this.updateAllPagesActivation();
  266.     },
  267.  
  268.     updateOption: function(name, value)
  269.     {
  270.         if (name = "allPagesActivation")
  271.             this.updateAllPagesActivation();
  272.     },
  273.  
  274.     updateAllPagesActivation: function()
  275.     {
  276.         var menu = $('menu_AllOn');
  277.         if (menu)
  278.             menu.setAttribute("checked", (Firebug.allPagesActivation=="on"));
  279.     },
  280.  
  281.     allOn: function()
  282.     {
  283.         Firebug.allPagesActivation = "on";  // In future we always create contexts,
  284.         Firebug.toggleBar(true);  // and we turn on for the current page
  285.     }
  286. });
  287.  
  288. // ************************************************************************************************
  289.  
  290. Firebug.Activation.TabWatcherListener =
  291. {
  292.     watchBrowser: function(browser)
  293.     {
  294.         Firebug.Activation.watchBrowser(browser);
  295.     },
  296.  
  297.     unwatchBrowser: function(browser, userCommands)
  298.     {
  299.         Firebug.Activation.unwatchBrowser(browser, userCommands);
  300.     }
  301. };
  302.  
  303. // ************************************************************************************************
  304.  
  305. Firebug.registerModule(Firebug.Activation);
  306.  
  307. // ************************************************************************************************
  308. }});
  309.